package com.kotlin.lib

/**对象表达式格式为object：interface|abstractClass
 *
 * 1.匿名对象只能在局部变量范围内或者是被private修饰的成员变量内才能被识别出真正的类型
 *如果将匿名对象当做一个public的方法返回或者是public的属性类型，
 * 那么它的类型就是该匿名对象所声明的父类型，如果没有声明任何父类型，那么就是Any，
 * 在这种情况下，匿名对象声明的任何成员都是无法访问的
 *(从下面的例子可以看出，成员变量这部分依然正确，但是作为函数返回值这部分，好像已经发生了变更)
 */

interface CallBack<T> {
    fun onResult(t: T)
}

abstract class ParentCallBack<T> {
    abstract fun onResultSuccess(t: T)

    abstract fun onFailed(resultCode: Int, message: String? = null)
}

fun main() {

    val callBack = object : ParentCallBack<Fruit>(), CallBack<Int> {
        override fun onResult(t: Int) {
            println("OnResultCallBack:$t")
        }

        override fun onResultSuccess(t: Fruit) {
            println("onResultSuccess:$t")
        }

        override fun onFailed(resultCode: Int, message: String?) {
            println("onFailed resultCode=$resultCode, message=$message")
        }
    }

    callBack.onResult(100)
    callBack.onResultSuccess(Apple())
    callBack.onFailed(10, "timeout")


    val obj = ObjectImpressionClass()

    obj.printObj()
}

class ObjectImpressionClass {
    private val myObject = object {
        val name: String = "hawking"

        fun method() {
            println("****************")
            println("ObjectImpressionClass#method invoked. ${method1().string}")

            println(method2().string)
//            println( method2() is Any)
            println("****************")
        }


        private fun method1() = object {
            val string = "hello"
        }

        fun method2() = object {
            val string = "world"
        }
    }

    fun printObj() {
        println(myObject.name)
        myObject.method()

        println(myObject)
    }
}